﻿#include "StdAfx.h"
#include "Triangle.h"

CTriangle::CTriangle(CGame* game)
:Object(game)	//오브젝트 속성을 상속받았음.
{	
	RenderData* renderData;		//정점개수 및 그리기에 필요한 변수 정보의 구조체를 선언.
	renderData = new RenderData;	//포인터로 선언했으니 메모리 할당
	mRenderDataList.push_back(renderData);	//그리기할 데이터 리스트에 정보(포인터)를 벡터에 보관한다(Push_back)

	//TriangleVertexData : 정점의 속성(위치값, 컬러, tu, tv 등)을 가지고 있는 구조체
	renderData->mVertexSize = sizeof(TriangleVertexData);	//정점 하나의 메모리 크기(size)를 입력
	renderData->mVertexCount = 3;	//전체 정점의 개수를 입력

	//정점 정보의 입력
	mVertexDataCreatorList.push_back(VData()); // vb와 ib의 생성 파괴를 담당하는 객체
	VData& vData = *(mVertexDataCreatorList.rbegin());
	TriangleVertexData* vb = vData.CreateVB(3);		//[3]개의 정점 메모리를 할당받는다
	vb[0].x = 0.0f;
	vb[0].y = 2.0f;
	vb[0].z = 0.0f;
	vb[0].color = 0xffff00ff;
	vb[0].tu = 0.0f;
	vb[0].tv = 0.0f;

	vb[1].x = 1.0f;
	vb[1].y = 0.0f;
	vb[1].z = 0.0f;
	vb[1].color = 0xff00ffff;
	vb[1].tu = 0.0f;
	vb[1].tv = 0.0f;

	vb[2].x = -1.0f;
	vb[2].y = 0.0f;
	vb[2].z = 0.0f;
	vb[2].color = 0xffffff00;
	vb[2].tu = 0.0f;
	vb[2].tv = 0.0f;

	//renderdata의 정점 포인터를 세팅
	renderData->mVertexBuffer = (BYTE*)vb;		//[3]개의 정점 메모리를 할당받는다

	renderData->mIndexCount = 3;
	renderData->mIndexBuffer = vData.CreateIB(3);
	renderData->mIndexBuffer[0] = 0;
	renderData->mIndexBuffer[1] = 1;
	renderData->mIndexBuffer[2] = 2;

	renderData->FVF = D3DFVF_VERTEX;
	renderData->mDrawType = D3DPT_TRIANGLELIST;
	renderData->mFaceNum = 1;

	renderData->mMatrix = GetWorldMatrix();

	// stage state
	renderData->mRenderState.push_back(State(0,D3DRS_CULLMODE, D3DCULL_CCW));
	renderData->mRenderState.push_back(State(0,D3DRS_FILLMODE, D3DFILL_SOLID));
	renderData->mRenderState.push_back(State(0,D3DRS_LIGHTING, FALSE));
 	renderData->mRenderState.push_back(State(0,D3DRS_ZENABLE, TRUE));

	// sampler state
	renderData->mSamplerState.push_back(State(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR));
	renderData->mSamplerState.push_back(State(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR));
	renderData->mSamplerState.push_back(State(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE));
}

CTriangle::~CTriangle(void)
{
}

bool CTriangle::Tick()
{
	return true;
}

bool CTriangle::PrepareRender()
{
	return true;
}

void CTriangle::VisitRender( RenderDataList& renderList )
{
	// 삼각형 한개 밖에 없다고 생각하고 [0] 사용
	// transform 데이터를 받아서 render data를 갱신한다.
	if ( !mRenderDataList.empty() )
	{
		mRenderDataList[0]->mMatrix = GetWorldMatrix();
	}

	//데이타리스트의 시작부터 끝까지 카피해준다. renderList에
	//back_inserter 컨테이너의 insert할 위치를 뒤쪽으로 지정해서 리턴해준다.
	std::copy(mRenderDataList.begin(), mRenderDataList.end(), std::back_inserter(renderList));
}